package com.treasure.mall.biz.service.core.product;

import com.treasure.mall.biz.base.SearchableCrudService;
import com.treasure.mall.biz.dto.condition.ProductApiSearchCondition;
import com.treasure.mall.biz.dto.product.LiveProductSaveDTO;
import com.treasure.mall.biz.dto.product.NormalProductSaveDTO;
import com.treasure.mall.biz.entity.product.ProductPO;
import com.treasure.mall.biz.vo.PageDataVO;
import com.treasure.mall.biz.vo.product.ProductApiDetailVo;
import com.treasure.mall.biz.vo.product.ProductApiVo;
import com.treasure.mall.zbq.common.base.ApiResult;

import java.util.List;

/**
 * @author wm
 */
public interface ProductService extends SearchableCrudService<ProductPO, Long> {
    /**
     * 保存店铺商品
     *
     * @param saveDTO
     * @return
     */
    ApiResult saveNormalProduct(NormalProductSaveDTO saveDTO);

    /**
     * 保存直播商品
     *
     * @param saveDTO
     * @return
     */
    ApiResult saveLiveProduct(LiveProductSaveDTO saveDTO);

    /**
     * 删除商品
     *
     * @param productId
     * @return
     */
    ApiResult delProduct(Long productId);

    /**
     * 接口搜索
     *
     * @param condition
     * @return
     */
    PageDataVO<ProductApiVo> search(ProductApiSearchCondition condition);

    /**
     * 获取详情
     *
     * @param productId
     * @return
     */
    ProductApiDetailVo getDetail(Long productId);

    /**
     * 改变状态
     *
     * @param productId
     * @param statusCode
     * @return
     */
    ApiResult changeStatus(Long productId, Integer statusCode);


    /**
     * 改变状态
     *
     * @param productId
     * @param statusCode
     * @return
     */
    ApiResult changeTopStatus(Long productId, Integer statusCode);

    /**
     * 加工专属用户
     *
     * @param productPOS
     */
    void processExclusiveUser(List<ProductPO> productPOS);

    int addLockedStore(Long productId, int store, long version);

    int minusStore(Long productId, int store, long version);

    int updateStores(Long productId, int store, int lockedStore);

    /**
     * 锁定库存
     *
     * @param productId
     * @param num
     * @return
     */
    ApiResult lockStore(Long productId, int num);

    /**
     * 检查指定类目是否关联商品
     *
     * @param categoryId
     * @return
     */
    boolean checkProductExistByCategoryId(Long categoryId);
}